package cn.itcast.bos.web.action;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import com.aliyuncs.exceptions.ClientException;

import cn.itcast.bos.utils.MailUtils;
import cn.itcast.crm.domain.Customer;

@Controller
@Scope("prototype")
@Namespace("/")
@ParentPackage("json-default")
public class CustomerAction extends BaseAction<Customer> {

	// 注入消息队列模板jmsTemplate
	@Autowired
	@Qualifier("jmsQueueTemplate")
	private JmsTemplate JmsTemplate;

	// 参数手机号封装在模型驱动 里面
	@Action(value = "customer_sendSms")
	public String sendSms() throws ClientException {

		// 产生一个随机数
		final String randomCode = RandomStringUtils.randomNumeric(4);
		// 将短信验证码保存到session
		ServletActionContext.getRequest().getSession().setAttribute("randomCode", randomCode);

		System.out.println("手机验证码：" + randomCode);

		// SendSmsResponse response = SmsUtils.sendSms(model.getTelephone(),
		// randomCode);

		/*
		 * if (response.getCode() != null && response.getCode().equals("ok")) {
		 * System.out.println("短信发送成功");
		 * 
		 * } else {
		 * 
		 * System.out.println("短信发送失败"); }
		 */

		// 调用MQ服务，发送一条消息
		JmsTemplate.send("sendMessage", new MessageCreator() {

			@Override
			public Message createMessage(Session session) throws JMSException {

				MapMessage mapMessage = session.createMapMessage();
				// 在消息里面存值
				mapMessage.setString("telephone", model.getTelephone());
				mapMessage.setString("randomCode", randomCode);
				return mapMessage;
			}
		});

		System.out.println("消息已经发送");
		return NONE;
	}

	/**
	 * 注册功能，将激活邮件发送到邮箱
	 */

	// 因为验证码不是customer里面的属性，所以要用到属性驱动来获取表单提交的验证码
	private String checkcode;
	private Response post;

	public void setCheckcode(String checkcode) {
		this.checkcode = checkcode;
	}

	// 注入spring提供的redis模板
	@Autowired
	private RedisTemplate<String, String> redisTemplate;

	@Action(value = "customer_regist", results = {
			@Result(name = "success", location = "signup-success.html", type = "redirect"),
			@Result(name = "error", type = "redirect", location = "signup.html") })
	public String regist() {
		// 这个功能就是将注册的数据写入数据库
		// 获取session里面存入的验证码，与表单客户输入的验证码做对比
		String randomCode = (String) ServletActionContext.getRequest().getSession().getAttribute("randomCode");

		if (randomCode != null && randomCode.equals(checkcode)) {
			// 此时验证码与发送的一致
			WebClient.create("http://localhost:8081/crm_management/service/customerService/customer")
					.type(MediaType.APPLICATION_JSON).post(model);

			System.out.println("注册成功");

			/**
			 * 发送邮件功能
			 */
			// 生成激活码
			String activeCode = RandomStringUtils.randomNumeric(32);
			// 将激活码保存到redis,设置24小时失效
			redisTemplate.opsForValue().set(model.getTelephone(), activeCode, 1, TimeUnit.DAYS);

			// 编写邮件的文本内容

			String content = "亲爱的小宝贝，么么哒，请在24小时内进行邮箱的绑定哦，点击下面的地址即可以完成绑定:<br/><a href='" + MailUtils.activeUrl
					+ "?telephone=" + model.getTelephone() + "&activeCode=" + activeCode + "'>速运快递邮箱 的绑定地址</a>";

			// 运用邮件工具类发送邮件
			MailUtils.sendMail("小宝贝，点我", content, model.getEmail(), activeCode);
			// 当注册成功的时候，平台会给用户的邮箱发送激活邮件，当客户点击了邮件进行激活，后台会收到邮件激活的请求
			// 如访问路径：http://localhost:9003/bos_fore/customer_activeMail?telephone=13812345678&activecode=261
			return SUCCESS;
		} else {
			System.out.println("注册失败");
			return ERROR;
		}

	}

	/**
	 * 判断用户是否有绑定邮箱，没有就将绑定的属性（type）修改为1，
	 */

	// 获取激活码
	private String activeCode;

	// 提供setter方法
	public void setActiveCode(String activeCode) {
		this.activeCode = activeCode;
	}

	@Action(value = "customer_activeMail")
	public String activeMail() {
		// 设置字符集编码
		ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");

		// ，我们需要做的判断是根据用户的手机号（这里要保证手机号与账户的唯一性）去数据库查询标记邮箱是否绑定的字段type的值，看用户是否已经激活

		Customer customer = WebClient
				.create("http://localhost:8081/crm_management/service/customerService/customer/telephone/"
						+ model.getTelephone())
				.accept(MediaType.APPLICATION_JSON).get(Customer.class);// 查询用get请求,里面的参数是获取数据对应的实体类

		// 判断customer的type值是否为一
		if (customer.getType() == null || customer.getType() != 1) {

			// 判断激活码是否有效
			String activeCodeRedis = redisTemplate.opsForValue().get(model.getTelephone());

			// 判断
			if (activeCodeRedis == null || !activeCodeRedis.equals(activeCode)) {

				// 此时激活码失效或者缓存的激活码与请求提交的激活码不一致
				try {
					ServletActionContext.getResponse().getWriter()
							.write("激活码已经失效，点击重新发送验证码<a href='http://localhost:8082/bos_fore/customer_reSendActiveCode.action?telephone="
									+ model.getTelephone() + "&email=" + customer.getEmail() + "'>请重新进行绑定</a>");
				} catch (IOException e) {

					e.printStackTrace();
				}

			} else {
				// 没有修改，此时需要发送修改的请求到crm系统
				WebClient.create("http://localhost:8081/crm_management/service/customerService/customer/updatetype/"
						+ model.getTelephone()).put(null);

				// 进行绑定后，将redis中存储的激活码删除
				redisTemplate.delete(model.getTelephone());
				try {

					ServletActionContext.getResponse().getWriter().write("激活成功");

					// redisTemplate.delete(model.getTelephone());
				} catch (IOException e) {

					e.printStackTrace();
				}

			}

		} else {
			// 响应邮箱已经绑定过的信息
			try {
				ServletActionContext.getResponse().getWriter().write("您的邮箱已经进行过绑定");
			} catch (IOException e) {

				e.printStackTrace();
			}

		}

		return NONE;
	}

	/**
	 * 重新发送激活码
	 * http://localhost:8082/bos_fore/customer_reSendActiveCode.action?telephone
	 * ="+model.getTelephone()+"&email="+model.getEmail()
	 */

	@Action(value = "customer_reSendActiveCode")
	public String reSendActiveCode() {
		// 重新生成激活码，存到session中
		// 生成激活码
		String activeCode = RandomStringUtils.randomNumeric(32);
		// 将激活码保存到redis,设置24小时失效
		redisTemplate.opsForValue().set(model.getTelephone(), activeCode, 1, TimeUnit.DAYS);

		// 编写邮件的文本内容

		String content = "亲爱的小宝贝，么么哒，请在24小时内进行邮箱的绑定哦，点击下面的地址即可以完成绑定:<br/><a href='" + MailUtils.activeUrl
				+ "?telephone=" + model.getTelephone() + "&activeCode=" + activeCode + "'>速运快递邮箱 的绑定地址</a>";

		// 运用邮件工具类发送邮件
		MailUtils.sendMail("小宝贝，点我", content, model.getEmail(), activeCode);

		return NONE;

	}

	/**index.html#/myhome
	 * 用户登陆验证customer_login
	 */
//*****对应的结果集的名字不能写大写，大写的识别不出来,成功不能直接跳转到myhome.html,网页会出现乱码 ，有的效果出不来
	@Action(value = "customer_login", results = {
			@Result(name = "success", type = "redirect", location = "index.html#/myhome"),
			@Result(name = "error", type = "redirect", location = "login.html") })
	public String login() {
		// 根据手机号去数据库查询是否有匹配的用户信息，客户的信息在客户关系系统，所以这里需要 用到websevice技术
		Customer customer = WebClient
				.create("http://localhost:8081/crm_management/service/customerService/customer/login?telephone="
						+ model.getTelephone() + "&password=" + model.getPassword())
				.accept(MediaType.APPLICATION_JSON).get(Customer.class);

		//判断是否存在符合要求的customer对象
		if(customer==null){
			
			//此时登陆信息错误
			return ERROR;
		}else{
			//登陆成功，将信息存入session中
			ServletActionContext.getRequest().getSession().setAttribute("customer", customer);
			
			return SUCCESS;
			
		}
		
		
		
	}
}
